package com.huike.springboot1.demos.controller;

import com.huike.springboot1.demos.pojo.Product;
import com.huike.springboot1.demos.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import java.math.BigDecimal;
import java.util.List;

//前台操作：
@Controller
public class ProductController {
/*    1：准备数据库，表，数据
      2：根据表结构创建实体类，实体类是前后端和java和数据库关联的桥梁
      3：完成持久层的开发并测试，即数据访问层，即创建实体类对应的Mapper类(要有注解)的接口和对应的xml配置文件(Mapper怎么和配置文件绑定)
      4：完成服务层的开发(可省略测试)，设置业务数据的开发与处理，业务逻辑代码编写，调用持久层的方法，但必须存在
      5：完成控制层的开发与测试，注意怎么将数据进行传递，作用:将模型传递到视图
      6：完成视图层的开发，利用thymeleaf和ui工具完成开发                                                                                                                                                                                                                                                                                                    
*/
    @GetMapping("/")
    public String index() {
        return "redirect:/productList1";   // 根路径直接跳到列表页
    }

    @Autowired
    ProductService productService;
    //网路路径(项目路径)
    @GetMapping("/productList")
//    控制层通过访问项目路径，可以将数据库中的数据以products为参数名传递到productList页面
//    Model：是SpringMVC中的"M“：模型(数据),前后端交互时的数据模型,后端向前端传递数据使用model    "V"：视图(页面)
    public String getProductList(Model model) {
        //TODO
//        model将数据作为products参数传递productList(视图)，括号内的内容是，参数名,参数值
        model.addAttribute("products", productService.getProductList());
        return "admin/productList";//返回一个在templates路径下的页面名称，productList是templates里的文件
        // 传递到页面的数据product可以通过美元符号$进行获取，在全局配置文件中设置页面文件路径
    }

    //网路路径(项目路径)
    //    法二：也可以用modelAndViewL类型
    @GetMapping("/productList1")
    public ModelAndView getProductList(ModelAndView modelAndView) {
        //TODO
//        model将数据作为products参数传递productList(视图)，括号内的内容是，参数名,参数值
        modelAndView.addObject("products", productService.getProductList());
        modelAndView.setViewName("admin/productList1");
        return modelAndView;
    }

    //    多条件查询
    @PostMapping("/searchProduct")
//    @ResponseBody 使用后返回值为字符串

//    如果前后端(视图层和控制层)的name属性的属性值参数名一致，如name="productName"，则可直接写： 类型 变量名 如： String name；
//    如果不一致则：要使用@RequestParam设置请求参数名称：@RequestParam(value = "旧变量名"  required = false) 类型 新变量名 ，类型用包装类型
//    如： @RequestParam(value = "minAmount", required = false) Integer min
//    类型要对应，否则会报错，Amount要用Double或BigDecimal，否则类型不对应会报错400
//    @RequestParam(...,required=true)非必填；@RequestParam(...,required=false)必填；@RequestParam(...,defaultValue="0")必填
//法一：不存在局部刷新
    public String searchProduct(Model model, String productName, @RequestParam(value = "minAmount", required = false) BigDecimal min, BigDecimal maxAmount, String productCategory) {
//        测试是否能拿到数据
        List<Product> list= productService.searchProduct(productName,min,maxAmount,productCategory);
        model.addAttribute("products", list);
        return "admin/productList";// html页面
    }
    //法二：存在局部刷新
//    public String searchProduct(Model model, String productName, @RequestParam(value = "minAmount", required = false) BigDecimal min, BigDecimal maxAmount, String productCategory) {
////        测试是否能拿到数据
//        List<Product> list= productService.searchProduct(productName,min,maxAmount,productCategory);
//        System.out.println(productName + "," + min + "," + maxAmount + "," + productCategory);
//        model.addAttribute("products", list);
////        通过替换部分页面内容来回显数据，不刷新页面，只是通过把数据返回到select页面中回应数据进行刷新
//        return "basic/select :: prodList";
//    }
}
